package transervfx.Vista;

import java.net.URL;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javafx.animation.Timeline;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Callback;
import transervfx.Dato.Entidad.Cliente;
import transervfx.Dato.Entidad.Fisico;
import transervfx.Dato.Entidad.Gestor;
import transervfx.Dato.Entidad.GuiaTramite;
import transervfx.Dato.Entidad.Lugar;
import transervfx.Dato.Entidad.Tramite;
import transervfx.Logica.GestorGestor;
import transervfx.Logica.GestorGuiaTramites;
import transervfx.Logica.GestorTramite;
import transervfx.Vista.XML.pathRecusosFXML;

/**
 * FXML Controller class
 *
 * @author meli
 */
public class CrearGuiaTramites extends VentanaModal {

    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 500;
    @FXML
    private TableView<Tramite> tableTramitesPendientes;
    //Tabla de trámites pendientes
    @FXML
    private TextField nroGuia;
    @FXML
    private TextField fechaGeneracionGuia;
    @FXML
    private TableColumn tableColumFechaRecepcionPendientes;
    @FXML
    private TableColumn tableColumClientePendientes;
    @FXML
    private TableColumn tableColumLugarTramitePendientes;
    @FXML
    private TableColumn tableColumDomicilioEntregaPendientes;
    @FXML
    private TableColumn tableColumTiempoEntregaPendientes;
    //Tabla de guía de tramites
    @FXML
    private TableView<Tramite> tableGuiaTramites;
    @FXML
    private TableColumn tableColumFechaRecepcionGuia;
    @FXML
    private TableColumn tableColumClienteGuia;
    @FXML
    private TableColumn tableColumLugarTramiteGuia;
    @FXML
    private TableColumn tableColumDomicilioEntregaGuia;
    @FXML
    private TableColumn tableColumTiempoEntregaGuia;
    @FXML
    private ComboBox<Gestor> gestor;
    final ObservableList<Tramite> dataSourceTramitesPendientes = FXCollections.observableArrayList();
    final ObservableList<Tramite> dataSourceTramitesEnGuia = FXCollections.observableArrayList();
    final ObservableList<Gestor> dataSourceGestor = FXCollections.observableArrayList();
    private Tramite tramiteView = new Tramite();
    private GuiaTramite guiaTramitesView = new GuiaTramite();

    public CrearGuiaTramites(Stage ventanaPadre, String titulo, int x, int y) {
        super(ventanaPadre, titulo, x, y);
        init();
    }

    public void init() {

       
        this.nroGuia.setText(this.guiaTramitesView.getId() + "");
        this.fechaGeneracionGuia.setText(this.guiaTramitesView.getFechaCreacion()+"");

        this.setTablaTramitesPendientes();
        this.setTablaTramitesEnGuia();

        this.gestor.setItems(dataSourceGestor);
        this.dataSourceGestor.addAll(GestorGestor.getInstance().findAll());
    }

    private void setTablaTramitesPendientes() {

        this.dataSourceTramitesPendientes.addAll(GestorTramite.getInstance().findAll());
        this.tableTramitesPendientes.setItems(dataSourceTramitesPendientes);



        this.tableTramitesPendientes.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);


        //Hace un binding entre la columna y las propiedades del tramite
        this.tableColumFechaRecepcionPendientes.setCellValueFactory(new PropertyValueFactory<Tramite, String>("fechaRecepcion"));
        this.tableColumClientePendientes.setCellValueFactory(new PropertyValueFactory<Tramite, String>("emisor"));
        this.tableColumLugarTramitePendientes.setCellValueFactory(new PropertyValueFactory<Tramite, String>("lugarTramite"));

        this.tableColumDomicilioEntregaPendientes.setCellValueFactory(new PropertyValueFactory<Tramite, String>("destino"));
        //IMPORTANTE CUAL VARIABLE ES EL LUGAR DE TRAMITE y CUAL ES EL DOMICILIO DE ENTREGAA!!!!


        /*this.tableColumLugarTramitePendientes.setCellValueFactory(
         new PropertyValueFactory<Tramite, String>("destino"));*/


        /*this.tableColumLugarTramitePendientes.setCellValueFactory(
         new Callback<CellDataFeatures<Lugar, String>, ObservableValue<String>>() {
         public ObservableValue<String> call(CellDataFeatures<Lugar, String> p) {
         // p.getValue() returns the Person instance for a particular TableView row
         return new SimpleStringProperty(p.getValue().getCalle() + p.getValue().getNumero() + p.getValue().getPiso() + p.getValue().getDepartamento() + p.getValue().getLocalidad().getNombre());
         }
         });

         this.tableColumDomicilioEntregaPendientes.setCellValueFactory(
         new Callback<CellDataFeatures<Lugar, String>, ObservableValue<String>>() {
         public ObservableValue<String> call(CellDataFeatures<Lugar, String> p) {
         // p.getValue() returns the Person instance for a particular TableView row
         return new SimpleStringProperty(p.getValue().getCalle() + p.getValue().getNumero() + p.getValue().getPiso() + p.getValue().getDepartamento() + p.getValue().getLocalidad().getNombre());
         }
         });*/

        this.tableColumTiempoEntregaPendientes.setCellValueFactory(
                new PropertyValueFactory<Tramite, String>("tiempoAproximadoDeEntrega"));
    }

    private void setTablaTramitesEnGuia() {

        this.tableGuiaTramites.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);


        //Hace un binding entre la columna y las propiedades del tramite
        this.tableColumClienteGuia.setCellValueFactory(
                new PropertyValueFactory<Tramite, String>("emisor"));


        this.tableColumTiempoEntregaGuia.setCellValueFactory(
                new PropertyValueFactory<Tramite, String>("tiempoAproximadoDeEntrega"));
    }

    public void buttonAceptar() {
        //si seria de esta forma pero igual tengo problemas con el bindig de las tablas
        this.guiaTramitesView.setGestor(this.gestor.getSelectionModel().getSelectedItem());
        this.guiaTramitesView.setTramites(dataSourceTramitesEnGuia);
        GestorGuiaTramites.getInstance().guardarGuiaTramites(guiaTramitesView);
    }

    public void buttonCancelar() {
        this.close();
    }

    //yo lo voy armando a este despues veremos si funka o no , lo voy pensando y dejando escrito
    //listo, intenta probar lo q vas haciendo haci no se hace un combo q correjir, y lo vemos cuando te atascas y es mas facil de correjir
    //vas re bien 
    //quise meter un tramite en la bd asi no mas para probar pero dio erroes de froreing key
    //cualquier cosa me encargo de hacer esa interfaz haci podes probar esta, alguien la tiene dibujada?si la sil la hizo
    public void buttonMenos() {

        List<Tramite> tramitesEnGuia = this.tableGuiaTramites.getSelectionModel().getSelectedItems();

        if (!tramitesEnGuia.isEmpty()) {

            int i = 0;
            if (tramitesEnGuia.iterator().hasNext()) {

                if (!this.dataSourceTramitesPendientes.contains((Tramite) tramitesEnGuia.get(i))) {

                    this.dataSourceTramitesPendientes.add(tramitesEnGuia.get(i));
                    this.dataSourceTramitesEnGuia.remove(tramitesEnGuia.get(i));
                    this.tableTramitesPendientes.setItems(dataSourceTramitesPendientes);
                    i++;

                }
            }
        }

    }

    public void buttonMas() {

        List<Tramite> tramitesPendientes = this.tableTramitesPendientes.getSelectionModel().getSelectedItems();


        if (!tramitesPendientes.isEmpty()) {

            int i = 0;
            if (tramitesPendientes.iterator().hasNext()) {
                if (!this.dataSourceTramitesEnGuia.contains((Tramite) tramitesPendientes.get(i))) {

                    this.dataSourceTramitesEnGuia.add(tramitesPendientes.get(i));
                    this.dataSourceTramitesPendientes.remove(tramitesPendientes.get(i));
                    this.tableGuiaTramites.setItems(dataSourceTramitesEnGuia);
                    i++;

                }
            }
        }

    }

    @Override
    URL getURLFXML() {
        return pathRecusosFXML.class
                .getResource("CrearGuiaTramitesFXML.fxml");
    }
}
